package com.ahp.util;

import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.hibernate.Query;

/**
 * 分页类
 * 
 * @author 李晓娜
 * 
 */

public class Pages {

	private String fileName = "";
	private int pageSize = 10; // 页大小
	private int allPage = 1; // 总页数
	private int cPage = 1; // 当前页
	private int sPage = 1; // 当前页开始记录数
	private int allRecord = 1; // 总记录数
	private String lastPageBreak = ""; // 分页字符串
	private int indexNumMax = 7;

	public Pages() {
	}

	public PageList pageList(Query query, Pages pages) {
		PageList pageList = new PageList();
		pages.setAllRecord(query.list().size());// 记录总行数
		query.setFirstResult((pages.getCPage() - 1) * pageSize);
		query.setMaxResults(pageSize);
		List rs = query.list();
		Iterator iterator = rs.iterator();
		// 得到分页字符串
		pages.getSPage();
		int i = 0;// 循环变量
		// 判断记录总行数是否大于0，并循环创建对象
		if (pages.getAllRecord() >= 0) {
			do {
				i++;
			} while (iterator.hasNext() && i < pages.getPageSize());
			pageList.setPage(pages);
			pageList.setObjectList(rs);
			return pageList;
		}
		return null;
	}

	public Pages(String fileName, HttpServletRequest request) {

		this.fileName = fileName;
		// 获得当前页
		String cPageStr = request.getParameter("cpage") == null ? "1" : request
				.getParameter("cpage");

		int cPageInt = 0;
		try {
			cPageInt = Integer.parseInt(cPageStr);
		} catch (Exception e) {
			cPageInt = 1;
		} finally {
			cPage = cPageInt;
		}
	}

	// 计算总页数,判断当前页的合法性，计算当前页的开始记录数，生成分页字符串
	public void doPage() {
		// 计算总页数
		this.allPage = (int) (this.allRecord + this.pageSize - 1)
				/ this.pageSize;

		// 判断当前页的合法性
		if (this.cPage < 0) {
			this.cPage = 1;
		}
		if (this.cPage > this.allPage) {
			this.cPage = this.allPage;
		}

		// 计算当前页开始记录数
		this.sPage = (this.cPage - 1) * this.pageSize + 1;

		// 生成分页字符串
		StringBuffer str = new StringBuffer();
		// 判断是否有问号“？”
		if (this.fileName.indexOf("?") == -1) {
			this.fileName = this.fileName + "?1=1";
		}

		str.append("<div style=\"float:left; height:20px; padding-top:3px;font-size:11px;\">");

		// 添加表单
		str.append("<form name=\"pagelist\" method=\"post\" action=\"");
		str.append(this.fileName + "\">");
		str.append(" 共" + this.allRecord + "条&nbsp;");

		// 第几页
		str.append("第");
		str.append(this.cPage);
		str.append("页");
		str.append("&nbsp;");

		// 共几页
		str.append("共");
		str.append(this.allPage);
		str.append("页");
		str.append("&nbsp;");
		int sign = 0;
		// 跳转页

		// 首页
		if (this.cPage > 1) {
			str.append("<a href=" + this.fileName + "&cpage=1>首页</a>");
		} else {
			str.append("首页");
		}
		str.append("&nbsp;");
		
		// 上一页
		if (this.cPage > 1) {
			str.append("<a href=");
			str.append(this.fileName + "&cpage=");
			str.append(this.cPage - 1);
			str.append(" >« 上一页</a>");
		} else {
			str.append("« 上一页");
		}
		str.append("&nbsp;");

		for (int i = 1; i <= this.allPage; i++) {
			if (this.cPage < indexNumMax && i < indexNumMax) {// 当前页在indexNumMax范围之内
				if(this.cPage == i){
					str.append("<font color=\"#ff0000\"><span class=\"nextprev\">" + this.cPage + "</span></font>");
				}else{
				str.append("<a href=");
				str.append(this.fileName + "&cpage=");
				str.append(i);
				str.append(">" + i + "</a>&nbsp;");
				}
			} else if (this.cPage >= indexNumMax && sign == 0) {// 当前页不在indexNumMax之内
				str.append("<a href=");
				str.append(this.fileName + "&cpage=");
				str.append(1);
				str.append(">" + 1 + "</a>&nbsp;");
				str.append("<a href=");
				str.append(this.fileName + "&cpage=");
				str.append(2);
				str.append(">" + 2 + "</a>&nbsp;");
				str.append("<span>...</span>");

				str.append("<a href=");
				str.append(this.fileName + "&cpage=");
				str.append(this.cPage - 2);
				str.append(">" + (this.cPage - 2) + "</a>&nbsp;");

				str.append("<a href=");
				str.append(this.fileName + "&cpage=");
				str.append(this.cPage - 1);
				str.append(">" + (this.cPage - 1) + "</a>&nbsp;");
				
				
				str.append("<font color=\"#ff0000\"><span class=\"nextprev\">" + this.cPage + "</span></font>");

				if (this.cPage < this.allPage) {
					str.append("<a href=");
					str.append(this.fileName + "&cpage=");
					str.append(this.cPage + 1);
					str.append(">" + (this.cPage + 1) + "</a>&nbsp;");
					str.append("<a href=");
					str.append(this.fileName + "&cpage=");
					str.append(this.cPage + 2);
					str.append(">" + (this.cPage + 2) + "</a>&nbsp;");
				}
				sign = 1;
				continue;
			}
		}

		// 下一页
		if (this.cPage < this.allPage) {
			str.append("<a href=");
			str.append(this.fileName + "&cpage=");
			str.append(this.cPage + 1);
			str.append(">下一页 »</a>");
		} else {
			str.append("下一页 »");
		}
		str.append("&nbsp;");

		if (this.allPage > this.cPage) {
			str.append("<strong>...</strong>");
		}

		// 末页
		if (this.cPage < this.allPage) {
			str.append("<a href=");
			str.append(this.fileName + "&cpage=");
			str.append(this.allPage);
			str.append(">末页</a>");
		} else {
			str.append("末页");
		}
		str.append("&nbsp;");
		
		str.append("&nbsp;&nbsp;跳转到 ");
		str	.append("<select name=\"cpage\" onchange=\"document.pagelist.submit()\" >");
		for (int i = 1; i <= this.allPage; i++) {
			str.append("<option value=\"");
			str.append(i);
			str.append("\"");
			if (this.cPage == i) {
				str.append(" selected");
			}
			str.append(">");
			str.append(i);
			str.append("</option>");
		}
		str.append("</select>&nbsp;页</div>");

	
		str.append("</form>");
 
		lastPageBreak = str.toString();
	}

	public int getAllPage() {
		return allPage;
	}

	public void setAllPage(int allPage) {
		this.allPage = allPage;
	}

	public int getCPage() {
		return cPage;
	}

	public void setCPage(int page) {
		cPage = page;
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public String getLastPageBreak() {
		return lastPageBreak;
	}

	public void setLastPageBreak(String lastPageBreak) {
		this.lastPageBreak = lastPageBreak;
	}

	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}

	public int getSPage() {
		doPage();
		return sPage;
	}

	public void setSPage(int page) {
		sPage = page;
	}

	public int getAllRecord() {
		return allRecord;
	}

	public void setAllRecord(int allRecord) {
		this.allRecord = allRecord;
	}

}
